ヘッダーをスキップ
Oracle TimesTen In-Memory Database SQLリファレンス・ガイド
リリース7.0
E05176-01
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

CREATE TABLE

CREATE TABLE文は、表を定義します。

アクセス制御

TimesTenインスタンスでアクセス制御が有効な場合、この文にはDDL権限が必要です。

SQL構文

永続表の構文は、次のとおりです。

CREATE TABLE [Owner.]TableName

(

    {{ColumnDefinition} [,...]

     [PRIMARY KEY (ColumnName [,...]) |

     [[CONSTRAINT ForeignKeyName]

        FOREIGN KEY ([ColumnName] [,...])

        REFERENCES RefTableName

             [(ColumnName [,...])] [ON DELETE CASCADE]] [...]

     }

)

[UNIQUE HASH ON (HashColumnName [,...])

    PAGES = PrimaryPages]

[AGING {LRU|

         USE ColumnName

              LIFETIME Num1 {MINUTE[S] | HOUR[S] |DAY[S]}                   [CYCLE Num2 {MINUTE[S] |HOUR[S] |DAY[S]}]

        }[ON|OFF]

]

一時表の構文は、次のとおりです。

CREATE GLOBAL TEMPORARY TABLE [Owner.]TableName

(

    {{ColumnDefinition} [,...]

     [PRIMARY KEY (ColumnName [,...]) |

     [[CONSTRAINT ForeignKeyName]

        FOREIGN KEY ([ColumnName] [,...])

        REFERENCES RefTableName

             [(ColumnName [,...])] [ON DELETE CASCADE]] [...]

      }

)

[UNIQUE HASH ON (HashColumnName [,...])

    PAGES = PrimaryPages]

[ON COMMIT { DELETE | PRESERVE } ROWS ]

パラメータ

CREATE TABLE文には、次のパラメータがあります。

[ Owner.]TableName
新しい表に割り当てる名前です。2つの表に同じ所有者名と表名を指定することはできません。

所有者名を指定していない場合は、ログイン名が新しい表の所有者名になります。TimesTenの表の所有者は、ユーザーIDの設定またはログイン名によって決まります。Oracle表の所有者名は、TimesTen表の所有者名と常に一致させる必要があります。

名前作成の規則については、「基本名」を参照してください。
GLOBAL TEMPORARY

作成する表を一時表にします。一時表は永続表と類似していますが、接続で参照された場合にのみ効率的にマテリアライズされます。

グローバル一時表定義は永続的であり、すべての接続に対して表示されますが、表インスタンスは各接続に対してローカルです。表インスタンスは、表を参照するコマンドが接続に対してコンパイルされる場合に作成され、接続が切断されると削除されます。同じ一時表のすべてのインスタンスの名前は同じですが、表名と追加の接続IDに基づいて識別されます。グローバル一時表は、一時領域に割り当てられます。

一時表の内容は接続間で共有できません。各接続では、その接続の表の内容のみが表示され、一時表を参照するコンパイルされたコマンドは接続間で共有されません。

一時表は、キャッシュ・グループまたはレプリケーション・スキームの一部として使用できません。一時表は、DATASTOREレベルのレプリケーションが定義されるときに自動的に除外されます。

キャッシュ・グループ表は、一時表として定義できません。

一時表の変更は、XLAで追跡できません。

一時表の操作でログ・レコードが生成されますが、生成されるログの量は、永続表よりも少なくなります。

ローカルの一時表は、サポートされていません。

ColumnDefinition
表の個々の列です。各表には、列が少なくとも1つ必要です。詳細は、「列定義」を参照してください。
ColumnName
作成される表の主キー列の名前を指定します。主キーには最大16列を指定できます。外部キーでは、ColumnNameはオプションです。外部キーが指定されていない場合は、親表の主キーを参照します。
PRIMARY KEY
PRIMARY KEYは、表定義に一度だけ指定します。これによって、1つ以上の列が表の主キーを構成していることを示します。主キーの内容は一意かつNOT NULLである必要があります。列には、UNIQUEと単一列PRIMARY KEYの両方を指定することはできません。
CONSTRAINT ForeignKeyName
オプションのユーザー定義の名前を外部キーに指定します。ユーザーが指定しない場合は、システムによってデフォルトの名前が指定されます。
FOREIGN KEY

新しい表とRefTableNameによって識別される参照先の表の間で外部キー制約を指定します。外部キー制約で指定される列には、2つのリストがあります。

最初のリストには新しい表の列を指定します。この列は参照元列と呼ばれます。2番目のリストには参照先の表の列を指定します。この列は参照先列と呼ばれます。これらの2つのリストのデータ型は、長さ、精度、スケールなどが同じである必要があります。参照先の表の参照先列には、あらかじめ主キーまたは一意索引を作成しておく必要があります。

参照先列の列名リストはオプションです。省略した場合、RefTableNameの1次索引が使用されます。

外部キーを宣言することにより、参照元列にTツリー索引が作成されます。参照先の表またはその参照先の索引は、参照元表を削除しないかぎり削除できません。

外部キー制約によって、新しい表の各行と参照先の表の行は、参照元列の内容と参照先列の内容が同じになるように一致させる必要があります。INSERTDELETEまたはUPDATE文が制約に違反した場合、TimesTenエラー3001が返されます。

TimesTenでは、SQL-92 NO ACTIONの更新および削除規則とON DELETE CASCADEがサポートされています。外部キー制約は遅延可能ではありません。

外部キーはグローバル一時表で定義できますが、グローバル一時表の参照のみを行うことができます。親表がCOMMIT DELETEを使用して定義されている場合は、子表にもCOMMIT DELETE属性が必要です。

外部キーは、アクティブな親表を参照できません。アクティブな親表とは、接続に対してマテリアライズされたインスタンスを持つ表のことです。

[ON DELETE
CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

UNIQUE
列の各行の値が一意である必要があることを示します。
UNIQUE HASH ON
表のハッシュ索引です。一意のハッシュ索引のみが作成されます。このパラメータは、等価条件に使用します。詳細は、「説明」を参照してください。UNIQUE HASH ONを指定するには、主キーの定義が必要です。
HashColumnName
この表のハッシュ・キーに含まれるよう表で定義された列です。ハッシュ索引で定義された列は、主キーの列と同じである必要があります。
PrimaryPages
表の想定ページ数を指定します。この数値に基づいて、表のハッシュ索引に割り当てられるバケットの数が決まります。最小値は1です。想定したページ数が少なすぎると、パフォーマンスが低下します。
[ON COMMIT
{ DELETE | PRESERVE } ROWS]
グローバル一時表を作成するトランザクションがコミットされるときに、行を削除するか、または保存するかを指定するオプションの文です。この文が指定されていない場合は、一時表の行が削除されます。
AGING LRU [ON | OFF]
指定されている場合、LRUポリシーを使用して表の行が削除されます。LRUエージングでは、最後に使用されてから長期間経過しているデータが削除され、最近使用されているデータのみがキャッシュに保持されます。使用中のデータ・ストア領域が指定のしきい値を超えると、データは削除されます。ほとんど使用されないデータで占有されていた領域は、LRUエージングによって解放されます。

LRUエージング・ポリシーは、AGING LRU句が指定されている場合に定義されます。ONやOFFの設定はエージング状態を参照します。

OFFの設定は、LRUエージング・ポリシーは定義されているが、エージング状態は無効であることを示しています。エージング状態がOFFであるため、エージングは自動的に実行されません。ONの設定は、LRUエージング・ポリシーが定義され、エージング状態が有効であることを示しています。エージング状態がONであるため、エージングは自動的に実行されます。デフォルトはONです。

LRUエージングの詳細は、「エージング」を参照してください。

LRUエージングについては、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表のエージングの実装に関する説明を参照してください。

AGING USE ColumnName...
[ON | OFF]
指定されている場合、時間ベースのエージング・ポリシーを使用して表の行が削除されます。時間ベースのエージングでは、データがキャッシュに保持される存続期間を指定できます。時間の単位は、分、時間または日数で指定します。

時間ベースのエージングを使用するには、エージング対象の表の列を定義する必要があります。この列の値はSYSDATEから差し引かれ、指定された単位(分、時間、日数)で切り捨てられた後、指定されたLIFETIME値との比較が行われます。その結果がLIFETIME値より大きい場合、その行はエージングの対象となります。列は、NOT NULLのTIMESTAMP型として定義します。

タイムスタンプ列の値は、アプリケーションによって更新されます。タイムスタンプ列の値が不明な行がある場合、その行が削除されないようにするには、タイムスタンプ列に大きなデフォルト値を定義します。

ColumnNameは、エージング対象の表に定義したタイムスタンプ列です。

AGING USE句を指定すると、時間ベースのエージング・ポリシーが定義されます。設定のONまたはOFFは、エージング状態を表します。

OFFの設定は、時間ベースのエージング・ポリシーは定義されているが、エージング状態は無効であることを示しています。エージング状態がOFFであるため、エージングは自動的に実行されません。ONの設定は、時間ベースのエージング・ポリシーが定義され、エージング状態が有効であることを示しています。エージング状態がONであるため、エージングは自動的に実行されます。デフォルトはONです。

時間ベースのエージングでは、アプリケーションにスライド期間を指定できます。

時間ベースのエージングの詳細は、「エージング」を参照してください。

時間ベースのエージングについては、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』の表のエージングの指定に関する説明を参照してください。

LIFETIME Num1 {MINUTE[S]|HOUR[S] |
DAY[S]}
この句は、時間ベースのエージングの場合に必須です。AGING USE ColumnName句の後に指定します。LIFETIMEは、データがキャッシュに保持されることが保証される時間です。たとえば、Num1単位時間の間、データがキャッシュに保持されます(単位は分または時間または日数)。つまり、指定されたLIFETIME値を超えた行はエージ・アウト(表から削除)されます。

Num1は、正の整数であることが必要です。Num1の値は、行がキャッシュにとどまる時間の長さを、分、時間または日数で示します。

時間の単位の概念がサポートされています。データの存続期間に指定された時間単位は、データがキャッシュに保持される単位時間の長さを表します。たとえば、時間の単位にDAYSを指定した場合、タイムスタンプの日付が同じ日になっているすべての行が同時にエージ・アウトされます。また、HOURSを時間の単位に指定した場合は、タイムスタンプ値の時間が同じ行が、すべて同時にエージ・アウトされます。

したがって、LIFETIMEが3 DAYSの場合は、LIFETIMEが72 HOURS(3×24)の場合やLIFETIMEが432 MINUTES(3×24×60)の場合とは異なります。

DAYSは、週末および祝日を含む1週間のすべての日を表します。

詳細は、「例5.66」を参照してください。

[CYCLE Num2 {MINUTE[S] |HOUR[S] |
DAY[S]}]
このオプションの句は、時間ベースのエージングに固有の句で、
LIFETIME句の後に指定します。この句は、データが指定したLIFETIME値を超えているかどうか、その結果エージ・アウト(削除)する必要があるかどうかを確認するために、
システムで行をチェックする頻度を示しています。

Num2は、正の整定数である必要があります。CYCLE句を指定しない場合、デフォルト値は5分です。これは、エージングが有効な場合、開始してすぐに、行が5分ごとにチェックされることを意味します。Num2に0を指定すると、エージングは継続され、エージング・スレッドがスリープ状態になることはありません。

列定義

SQL構文

ColumnName ColumnDataType
   [DEFAULT DefaultVal]
   [[NOT] INLINE]
   [PRIMARY KEY | UNIQUE |
   NULL [UNIQUE] |
   NOT NULL [PRIMARY KEY | UNIQUE] ]

パラメータ

列定義には、次のパラメータがあります。

ColumnName
新しい表の列に割り当てる名前です。表の2つの列に同じ名前を指定することはできません。表には最大255の列を定義できます。
DEFAULT
DefaultVal
INSERTで、列の値が指定されていない場合、デフォルト値DefaultValを列に挿入します。指定されたデフォルト値は、列のデータ型と互換性がある型である必要があります。デフォルト値には、関連付けられた列で許可されている任意のデータ型を指定できます。
DefaultValの有効なデータ型は、次のいずれかです。
ConstantValue: 詳細は、 「定数」を参照してください。
デフォルト値がユーザーのいずれかである場合、列のデータ型はCHARまたはVARCHARのいずれかであり、列の幅は30文字以上である必要があります。
ColumnDataType
列に格納できるデータ型です。長さを指定する必要があるデータ型もあります。指定できるデータ型については、「データ型」を参照してください。
INLINE |
NOT INLINE
デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。
NULL
列にNULL値を含めることができます。
NOT NULL
列にNULL値を含めることはできません。NOT NULLを指定した場合、列にNULL値を保存しようとする文はすべて拒否されます。
UNIQUE
列に設定される一意制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。一意性を実現するために、TimesTenでは一意のTツリー索引が作成されます。これは、一意制約を持つ列は、制約を持たない列よりも多くのメモリーと時間を実行時に使用する可能性があることを意味します。PRIMARY KEYとともに使用することはできません。
PRIMARY KEY
列に設定される一意のNOT NULL制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。また、UNIQUEとともに使用することはできません。

説明

エージング

               {MINUTES |HOURS|DAYS}

     詳細は、「ALTER TABLE」を参照してください。

例5.54

Tツリー索引は、主キーであるPartNumberに作成されます。

Command> CREATE TABLE Price

> (PartNumber INTEGER NOT NULL PRIMARY KEY,

> VendorNumber INTEGER NOT NULL,

> VendPartNum CHAR(20) NOT NULL,

> UnitPrice DECIMAL(10,2),

> DeliveryDays SMALLINT,

> DiscountQty SMALLINT);

Command> indexes price;

Indexes on table SAMPLEUSER.PRICE:

PRICE: unique T-tree index on columns:

PARTNUMBER

1 index found.

1 table found.

例5.55

ハッシュ索引は、主キーであるClubName列に作成されます。

CREATE TABLE Recreation.Clubs

(ClubName CHAR(15) NOT NULL PRIMARY KEY,

 ClubPhone SMALLINT,

 Activity CHAR(18))

UNIQUE HASH ON (ClubName) PAGES = 30;

例5.56

Tツリー索引は、2つの列MemberNameおよびClubで作成されます(共に主キーであるため)。

Command> CREATE TABLE Recreation.Members

> (MemberName CHAR(20) NOT NULL,

> Club CHAR(15) NOT NULL,

> MemberPhone SMALLINT,

> PRIMARY KEY (MemberName, Club));

Command> indexes recreation.members;

Indexes on table RECREATION.MEMBERS:

MEMBERS: unique T-tree index on columns:

MEMBERNAME

CLUB

1 index found.

1 table found.

例5.57

Recreation.Events表にはハッシュ索引は作成されません。

CREATE TABLE Recreation.Events

(SponsorClub CHAR(15),

 Event CHAR(30),

 Coordinator CHAR(20),

 Results VARBINARY(10000));

例5.58

ハッシュ索引は、VendorNumber列に作成されます。

CREATE TABLE Purchasing.Vendors

(VendorNumber INTEGER NOT NULL PRIMARY KEY,

 VendorName CHAR(30) NOT NULL,

 ContactName CHAR(30),

 PhoneNumber CHAR(15),

 VendorStreet CHAR(30) NOT NULL,

 VendorCity CHAR(20) NOT NULL,

 VendorState CHAR(2) NOT NULL,

 VendorZipCode CHAR(10) NOT NULL,

 VendorRemarks VARCHAR(60))

UNIQUE HASH ON (VendorNumber) PAGES = 101;

例5.59

ハッシュ索引は、列MemberNameおよびClubで作成されます(共に主キーであるため)。

CREATE TABLE Recreation.Members

(MemberName CHAR(20) NOT NULL,

 Club CHAR(15) NOT NULL,

 MemberPhone SMALLINT,

 PRIMARY KEY (MemberName, Club))

UNIQUE HASH ON (MemberName, Club) PAGES = 100;

例5.60

ハッシュ索引は、列FirstNameおよびLastNameに作成されます(共にAuthors表の主キーであるため)。

外部キーは、Authors表の主キーを参照するBooks表のAuthorFirstNameとAuthorLastName列に作成されます。

CREATE TABLE Authors

(FirstName VARCHAR(255) NOT NULL,

LastName VARCHAR(255) NOT NULL,
Description VARCHAR(2000),

PRIMARY KEY (FirstName, LastName))

UNIQUE HASH ON (FirstName, LastName) PAGES=20;

CREATE TABLE Books
(Title VARCHAR(100),
AuthorFirstName VARCHAR(255),
AuthorLastName VARCHAR(255),

Price DECIMAL(5,2),

FOREIGN KEY (AuthorFirstName, AuthorLastName)
REFERENCES Authors(FirstName, LastName));

例5.61

次の文では、VARCHAR列のデフォルト文字が優先され、1つのVARCHAR (10)列がNOT INLINEで、1つのVARCHAR (144)がINLINEである表が作成されます。

CREATE TABLE t1 (c1 VARCHAR(10) NOT INLINE NOT NULL,

c2 VARCHAR(144) INLINE NOT NULL);

例5.62

次の文では、本のタイトルのUNIQUE列を持つ表が作成されます。

CREATE TABLE Books
(Title VARCHAR(100) UNIQUE,
AuthorFirstName VARCHAR(255),
AuthorLastName VARCHAR(255),

Price DECIMAL(5,2),

FOREIGN KEY (AuthorFirstName, AuthorLastName)
REFERENCES Authors(FirstName, LastName));

例5.63

次の文では、列x1のデフォルト値が1で、列dのデフォルト値がSYSDATEである表が作成されます。

CREATE TABLE t1 (x1 INT DEFAULT 1, d TIMESTAMP DEFAULT SYSDATE);

例5.64

例のCREATE table TtreeExにあるCol1は、主キーとして定義されます。Tツリー索引はデフォルトで作成されます。

Command> create table TtreeEx (Col1 TT_INTEGER PRIMARY KEY);

Command> INDEXES TtreeEx;

Indexes on table SAMPLEUSER.TTREEEX:

TTREEEX: unique T-tree index on columns:

COL1

1 index found.

1 table found.

例5.65

次の文は、HRスキーマの親表および子表におけるON DELETE CASCADE句の使用を示しています。外部キーを持つ表は、ON DELETE CASCADEが有効に変更されています。

ALTER TABLE countries

ADD CONSTRAINT countr_reg_fk

FOREIGN KEY (region_id)

REFERENCES regions(region_id) ON DELETE CASCADE;

ALTER TABLE locations

ADD CONSTRAINT loc_c_id_fk

FOREIGN KEY (country_id)

REFERENCES countries(country_id) ON DELETE CASCADE;

ALTER TABLE departments

ADD CONSTRAINT dept_loc_fk

FOREIGN KEY (location_id)

REFERENCES locations (location_id) ON DELETE CASCADE;

ALTER TABLE employees

ADD CONSTRAINT emp_dept_fk

FOREIGN KEY (department_id)

REFERENCES departments ON DELETE CASCADE;

ALTER TABLE employees

ADD CONSTRAINT emp_job_fk

FOREIGN KEY (job_id)

REFERENCES jobs (job_id);

ALTER TABLE job_history

ADD CONSTRAINT jhist_job_fk

FOREIGN KEY (job_id)

REFERENCES jobs;

ALTER TABLE job_history

ADD CONSTRAINT jhist_emp_fk

FOREIGN KEY (employee_id)

REFERENCES employees ON DELETE CASCADE;

ALTER TABLE job_history

ADD CONSTRAINT jhist_dept_fk

FOREIGN KEY (department_id)

REFERENCES departments ON DELETE CASCADE;

;

例5.66

次の例は、エージングにおいて、時間の単位がどのように機能するかを示しています。

LIFETIMEが3日の場合(日単位):

(SYSDATE - 列値) <= 3の場合、エージ・アウトされません。

(SYSDATE - 列値) >= 3の場合、エージ・アウトの対象となります。

(SYSDATE - 列値) = 3日と22時間の場合:

LIFETIMEを3日に指定した場合、行はエージ・アウトされません。LIFETIMEを72時間に指定した場合、行はエージ・アウトされます。

例5.67

次の例では、LRUエージングを持つ表を作成します。エージング状態は、デフォルトでONになっています。

CREATE TABLE AgingDemo

(AgingId NUMBER NOT NULL PRIMARY KEY

,Name VARCHAR2 (20)

)

AGING LRU;

Command> DESCRIBE AgingDemo;

Table USER.AGINGDEMO:

Columns:

*AGINGID NUMBER NOT NULL

NAME VARCHAR2 (20) INLINE

Aging lru on

1 table found.

(primary key columns are indicated with *)

例5.68

次の例では、時間ベースのエージングを使用する表を作成します。存続期間は3日で、サイクルは指定されていないため、デフォルトで5分です。エージング状態はOFFです。

CREATE TABLE AgingDemo2

(AgingId NUMBER NOT NULL PRIMARY KEY

,Name VARCHAR2 (20)

,AgingColumn TIMESTAMP NOT NULL

)

AGING USE AgingColumn LIFETIME 3 DAYS OFF;

Command> DESCRIBE AgingDemo2;

Table USER.AGINGDEMO2:

Columns:

*AGINGID NUMBER NOT NULL

NAME VARCHAR2 (20) INLINE

AGINGCOLUMN TIMESTAMP (6) NOT NULL

Aging use AGINGCOLUMN lifetime 3 days cycle 5 minutes off

1 table found.

(primary key columns are indicated with *)

例5.69

次の例では、エラー・メッセージが生成されます。これは、エージング・ポリシーを一度作成すると、変更できないことを示しています。エージングを削除して、再定義する必要があります。

CREATE TABLE AgingDemo2

(AgingId NUMBER NOT NULL PRIMARY KEY

,Name VARCHAR2 (20)

,AgingColumn TIMESTAMP NOT NULL

)

AGING USE AgingColumn LIFETIME 3 DAYS OFF;

ALTER TABLE AgingDemo2

ADD AGING LRU;

2980: Cannot add aging policy to a table with an existing aging policy. Have to drop the old aging first

The command failed.

DROP aging on the table and redefine with LRU aging.

ALTER TABLE AgingDemo2

DROP AGING;

ALTER TABLE AgingDemo2

ADD AGING LRU;

Command> DESCRIBE AgingDemo2;

Table USER.AGINGDEMO2:

Columns:

*AGINGID NUMBER NOT NULL

NAME VARCHAR2 (20) INLINE

AGINGCOLUMN TIMESTAMP (6) NOT NULL

Aging lru on

1 table found.

(primary key columns are indicated with *)

関連項目

ALTER TABLE
DROP TABLE
TRUNCATE TABLE
UPDATE